#!/bin/bash

################################## 注意事项 ##############################
#  https://www.cnblogs.com/huxi2b/p/7427815.html
#  https://juejin.cn/post/6844903688503312392

    # ca-cert：CA文件，不要把该文件拷贝到别的broker机器上！
    # test-cluster-cert-signed：CA已签发的Kafka证书文件，不要把该文件拷贝到别的broker机器上！
    # test-cluster-cert：Kafka认证文件（包含公钥和私钥），不要把该文件拷贝到别的broker机器上！
    # kafka.keystore：Kafka的keystore文件，所有clients端和broker机器上都需要！
    # kafka.truststore：Kafka的truststore文件，所有clients端和broker机器上都需要！

################################## 设置环境变量 ##############################

# .env 配置的变量


# HOSTNAME=$(hostname)
# echo "获取HOSTNAME  $HOSTNAME"
# if grep -q "HOSTNAME" .env;  then
#     sed -i  "s/\(HOSTNAME=\).*/\1$HOSTNAME/"  .env
#     echo ".env 修改HOSTNAME变量，赋值  $HOSTNAME"
# else
#     echo "HOSTNAME=$HOSTNAME" >> .env
#     echo ".env 创建HOSTNAME 变量，赋值  $HOSTNAME"
# fi


source .env

PWD=$(pwd)
BASE_DIR=$PWD # SSL各种生成文件的基础路径
CERT_OUTPUT_PATH="$BASE_DIR/ssl/certificates" # 证书文件生成路径
PASSWORD="$CA_PASSWORD" # 密码
KEY_NAME="$NODE_NAME.keystore"
TRUST_NAME="$NODE_NAME.truststore"
KEY_STORE="$CERT_OUTPUT_PATH/$KEY_NAME" # Kafka keystore文件路径
TRUST_STORE="$CERT_OUTPUT_PATH/$TRUST_NAME" # Kafka truststore文件路径
KEY_PASSWORD=$PASSWORD # keystore的key密码
STORE_PASSWORD=$PASSWORD # keystore的store密码
TRUST_KEY_PASSWORD=$PASSWORD # truststore的key密码
TRUST_STORE_PASSWORD=$PASSWORD # truststore的store密码
CLUSTER_NAME="$CLUSTER" # 指定别名
CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert" # CA证书文件路径
CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert" # 集群证书文件路径
DAYS_VALID=3650 # key有效期
# CN：名字或者域名  OU：部门 O：公司  L：城市 ST：省份  C：国家
DNAME="CN=$DOMAIN_NAME, OU=test, O=ssitg, L=GuangDong, ST=ShenZhen, C=CN"  # 你的信息，注意，其中domain_name为kafka配置的外网访问域名，否则会报证书不一致错误
SUBJ="/C=CN/ST=GuangDong/L=ShenZhen/O=ssitg/CN=$DOMAIN_NAME"  # 新增参数，说明同上
##############################################################################


# 将docker-compose需要的证书路径写入 .env


echo "##############################"
echo "将证书名字写入 .env "


if grep -q "KEY_NAME" .env;  then
    sed -i  "s/\(KEY_NAME=\).*/\1$KEY_NAME/"  .env
    echo ".env 修改KEY_NAME变量，赋值  $KEY_NAME"
else
    echo "KEY_NAME=$KEY_NAME" >> .env
    echo ".env 创建KEY_NAME 变量，赋值  $KEY_NAME"
fi


if grep -q "TRUST_NAME" .env;  then
    sed -i  "s/\(TRUST_NAME=\).*/\1$TRUST_NAME/"  .env
    echo ".env 修改TRUST_NAME变量，赋值  $TRUST_NAME"
else
    echo "TRUST_NAME=$TRUST_NAME" >> .env
    echo ".env 创建TRUST_NAME变量，赋值  $TRUST_NAME"
fi




# IPADRESS=$(hostname -I | awk '{print $1}')
# echo "获取服务器IP  $IPADRESS"

# if grep -q "IPADRESS" .env;  then
#     sed -i  "s/\(IPADRESS=\).*/\1$IPADRESS/"  .env
#     echo ".env 修改IPADRESS变量，赋值  $IPADRESS"
# else
#     echo "IPADRESS=$IPADRESS" >> .env
#     echo ".env 创建IPADRESS变量，赋值  $IPADRESS"
# fi



mkdir -p $CERT_OUTPUT_PATH

# 每个节点都需要执行，为每一个节点生成一个公私密钥对 一个标识该机器的证书
echo "1. 创建集群证书到keystore......"
keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA    -storetype pkcs12   -ext SAN=DNS:$DOMAIN_NAME,IP:$IPADRESS  -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$DNAME"


#  只需要任意一个节点执行一次，会生成 ca-key ca

if [ -f  "$CERT_OUTPUT_PATH/ca-key" ]  && [ -f "$CERT_AUTH_FILE" ]; then 
    echo "2. CA已经存在，跳过创建步骤"
else
    echo "2. 创建CA......"
    openssl req -new -x509 -keyout $CERT_OUTPUT_PATH/ca-key -out "$CERT_AUTH_FILE" -days "$DAYS_VALID" -passin pass:"$PASSWORD" -passout pass:"$PASSWORD"  -subj "$SUBJ"
fi


echo "3. 导入CA文件到truststore......"
keytool -keystore "$TRUST_STORE" -alias CARoot  -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt

echo "4. 从key store中导出集群证书......"
keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

echo "5. 签发证书......"
openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE" \
-out "${CLUSTER_CERT_FILE}-signed" \
-days "$DAYS_VALID" -CAcreateserial -passin pass:"$PASSWORD"

echo "6. 导入CA文件到keystore......"
keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD" \
 -keypass "$KEY_PASSWORD" -noprompt

 echo "7. 导入已签发证书到keystore......"
keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed" \
 -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt